"""二维码识别模块"""
import cv2
from pyzbar import pyzbar
from pathlib import Path
from typing import Optional
import sys
sys.path.append(str(Path(__file__).parent.parent))
from utils.logger import get_logger

logger = get_logger()


class QRCodeReader:
    """二维码识别器"""
    
    def __init__(self, image_path: str):
        """
        初始化二维码识别器
        
        Args:
            image_path: 二维码图片路径
        """
        self.image_path = Path(image_path)
        
    def read(self) -> Optional[str]:
        """
        读取二维码并提取链接
        
        Returns:
            二维码中的链接，如果识别失败返回 None
        """
        logger.info(f"正在读取二维码：{self.image_path}")
        
        if not self.image_path.exists():
            logger.error(f"二维码图片不存在：{self.image_path}")
            return None
        
        try:
            # 读取图片
            image = cv2.imread(str(self.image_path))
            
            if image is None:
                logger.error(f"无法读取图片：{self.image_path}")
                return None
            
            # 解码二维码
            decoded_objects = pyzbar.decode(image)
            
            if not decoded_objects:
                logger.warning("未在图片中检测到二维码")
                return None
            
            # 获取第一个二维码的数据
            qr_data = decoded_objects[0].data.decode('utf-8')
            logger.info(f"二维码识别成功：{qr_data}")
            
            # 验证是否为问卷星链接
            if self._is_valid_wjx_url(qr_data):
                logger.info("检测到有效的问卷星链接")
                return qr_data
            else:
                logger.warning(f"二维码内容不是有效的问卷星链接：{qr_data}")
                return qr_data  # 仍然返回，由后续模块处理
                
        except Exception as e:
            logger.error(f"读取二维码时发生错误：{e}", exc_info=True)
            return None
    
    @staticmethod
    def _is_valid_wjx_url(url: str) -> bool:
        """
        验证是否为有效的问卷星链接
        
        Args:
            url: 待验证的链接
        
        Returns:
            是否为问卷星链接
        """
        wjx_domains = ['wjx.cn', 'wjx.top', 'sojump.com', 'sojump.hk']
        return any(domain in url.lower() for domain in wjx_domains)


def read_qr_code(image_path: str) -> Optional[str]:
    """
    快捷函数：读取二维码
    
    Args:
        image_path: 二维码图片路径
    
    Returns:
        二维码中的链接
    """
    reader = QRCodeReader(image_path)
    return reader.read()

